上一篇不小心介紹了 airbnb 風格不推薦的 for-of 語法,我們來仔細看看 ESLint airbnb 的規則到底是怎麼說的:
11.1 不要使用迭代器。更好的做法是使用 JavaScript 的高階函式,像是
map()
及reduce()
,替代如for-of 的迴圈語法。
竟然這樣,今天就來練習 map()
處理陣列的用法唄!
map()
特色函式
內所回傳的值組合成一個新的陣列undefined
簡單來說就是我們若用陣列
使用 map()
方法呼叫函式
的話,就可以讓陣列中每個元素執行完該函式
後,將每個元素的執行結果回傳到一個新的陣列
。
const newArr = arr.map(function (value, index, array){
//...
});
會使用回調函式(callback)與三個參數,說明如圖:
假如我是一個包租婆,陣列A儲存我每間房收的房租,但我最近比較缺錢所以打算漲個價斂財,每間房子直接改收兩倍
的租金,這時候就可以使用 map()
方法快速計算每間房子漲價後的房租,並儲存在B陣列中:
let A = [9000, 8500, 5500, 6500];
let B = A.map(function (value, index, array) {
return value*2;
});
console.log(A) // [9000, 8500, 5500, 6500] - 原陣列不會被修改
console.log(B) // [18000, 17000, 11000, 13000] - 發財摟 ^____^
let A = [9000, 8500, 5500, 6500];
let B = A.map(item => item*2);
console.log(B) // [18000, 17000, 11000, 13000] - 還是發財摟 ^____^
當啷~得到一樣的結果囉!是不是非常的簡短感覺好像很厲害呢!還沒使用過的朋友們下次可以試試看歐!
map()
方法使用起來跟 forEach()
方法非常類似,最大的區別就是 forEach()
會修改原本的陣列,而map()
方法可以回傳一個新的陣列,並保有原本的舊陣列,另外 forEach()
並不會回傳任何東西,所以寫在 return 裡的東西不會有作用哦!
沒有 return :
let A = [9000, 8500, 5500, 6500];
let B = A.map(function (value, index, array) {
return value*2; // forEach 沒有在 return 的,所以不會有作用
});
console.log(B); // undefined
想要達到一樣的結果可以這樣寫:
let A = [9000, 8500, 5500, 6500];
A.forEach(function (value, index, array) {
array[index] = value*2;
});
console.log(A); // [18000, 17000, 11000, 13000] - 發財摟 ^____^
參考文章
從ES6開始的JavaScript學習生活
卡斯伯:JavaScript 陣列處理方法 [filter(), find(), forEach(), map(), every(), some(), reduce()]
箭頭函式的範例程式碼那邊:var B = A.map(count= (item) => item*2);
不知道為什麼多了個 count=
應該是 var B = A.map(item => item*2);
才對
對欸多寫了XDD!看來我箭頭函式要再加強~噗噗
非常感謝提醒!!
forEach 沒有return
let B = A.map(function (value, index, array) {
應該是A.forEach?
應該是筆誤?
補充: 而且 forEach 並不會回傳任何東西,所以寫在 return 裡的東西不會有作用
哇!謝謝補充,我也同步分享範例在文章裡了~謝謝妳
包租婆這個比喻很有趣XD
map() 方法使用起來跟 forEach() 方法非常類似,最大的區別就是 forEach() 會修改原本的陣列
我倒認為最大差別就是會不會回傳新陣列,因為 forEach() 不一定會改到原陣列,可以依照裡面函式寫法選擇要不要改到。
給您參考 :)